#pragma once
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>
using namespace std;


inline string nil_bulk_string(){
    return "$-1\r\n";
}

inline string empty_bulk_string(){
    return "$0\r\n\r\n";
}

inline string  bulk_string(const string &strs){
    return "$"+to_string(strs.size())+"\r\n"+strs+"\r\n";
};

inline string simple_string(const char *str){
    return "+"+string(str)+"\r\n";
}

inline string simple_string(string &str){
    return "+"+str+"\r\n";
};

inline string simple_string(vector<string> strs){
    if(strs.empty()){
        return "+\r\n";
    }else{
        string res=strs.front();
        for(int i=1;i<strs.size();i++){
            res+=" "+strs[i];
        }
        return "+"+res+"\r\n";
    }
   
}

inline string array_string(vector<string> strs){
    string res = "*"+to_string(strs.size())+"\r\n";
    for(string str : strs){
        res += "$"+to_string(str.size())+"\r\n"+str+"\r\n";
    }
    return res;
};

inline string hex_to_bin(string &hex){
    std::string result;
    for (int i=0; i<hex.length(); i+=2) {
        uint32_t byte;
        std::stringstream ss;
        ss << std::hex << hex.substr(i, 2);
        ss >> byte;
        result.push_back(byte);
    }
    return result;

}